[アップデート] Lambdaから直接Parameter Store/Secrets Managerから値を取得できるようになりました!
こんにちは 新卒の南です。
今回のアップデートでLambdaから直接Parameter Store, Secrets Managerから値を取得できるようになりましたのでご紹介します。
アップデート概要
これまでLambdaでParameter StoreやSecrets Managerから値を取得する際はSDK経由で直接APIを叩いていました。
それぞれAPIのコールごとに課金(パラメータストアAPIインタラクション1万回ごとに0.05 USD)されますので、自前でキャッシュを実装していた方もいるのではないでしょうか?
今回のアップデートではLambdaから直接値を取ってこれるようになっただけではなく、AWS側でキャッシュしてくれることで、コストの削減•レイテンシーの改善を行うことができるようになります。
また、仕組みとしてはLambda Extensionsを使っており、関数呼び出しとは別に並列で処理を行い、値を取得しローカルキャッシュに保存します。
Lambda Extensionsに関しては以下のブログをご覧ください。
ちなみにArmアーキテクチャではまだサポートされていません。
やってみた
Parameter Storeを例にやってみました。
公式リファレンス
パラメーターストア
シークレットマネージャー
権限周り
SDKで実装していた時と同様、実行ロールに権限を渡す必要があります。
- ssm:GetParameter
また、暗号化されている場合(SecureStringの場合)は
- kms:DecryptSecureString
を付与する必要があります。
Lambda Extensionsの追加
「レイヤー」からExtensionsを追加します。 マネジメントコンソールの場合は 「AWS レイヤー」→ 「AWS-Parameters-and-Secrets-Lambda-Extension」を選択してください。
CLI等で設定する場合は公式リファレンスに記載のARNを入力して設定します。(ARNはリージョン毎に値が異なります。)
リージョン | ARN |
---|---|
米国東部 (バージニア北部) | arn:aws:lambda:us-east-1:177933569100:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2 |
アジアパシフィック (東京) | arn:aws:lambda:ap-northeast-1:133490724326:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2 |
アジアパシフィック (大阪) | arn:aws:lambda:ap-northeast-3:576959938190:layer:AWS-Parameters-and-Secrets-Lambda-Extension:2 |
環境変数の追加
環境変数を設定することで、キャッシュのTTLなど細かい値を制御することができます。
環境変数 | 必須 | 有効な値 | デフォルト | 説明 |
---|---|---|---|---|
SSM_PARAMETER_STORE_TIMEOUT_MILLIS | いいえ | すべての整数 | 0 | Parameter Store へのリクエストのタイムアウト (ミリ秒単位)。
値 0 は、タイムアウトがないことを示します。 |
SECRETS_MANAGER_TIMEOUT_MILLIS | いいえ | すべての整数 | 0 | Secrets Manager へのリクエストのタイムアウト (ミリ秒単位)。
値 0 は、タイムアウトがないことを示します。 |
SSM_PARAMETER_STORE_TTL | いいえ | 0 ~ 300 秒 (5 分) | 300000 ミリ秒 (5 分) | Parameter Storeから取得した値のキャッシュの最大有効存続時間 (秒単位)。値 0 は、キャッシュしないことを示します。PARAMETERS_SECRETS_EXTENSION_CACHE_SIZEの値が 0 の場合、この変数は無視されます 。 |
SECRETS_MANAGER_TTL | いいえ | 0 ~ 300 秒 (5 分) | 300000 ミリ秒 (5 分) | Secrets Managerから取得した値のキャッシュの最大有効存続時間 (秒単位)。値 0 は、キャッシュしないことを示します。PARAMETERS_SECRETS_EXTENSION_CACHE_SIZEの値が 0 の場合、この変数は無視されます 。 |
PARAMETERS_SECRETS_EXTENSION_CACHE_ENABLED | いいえ | True, False | true | 拡張機能のキャッシュを有効にするかどうかを決定します。 |
PARAMETERS_SECRETS_EXTENSION_CACHE_SIZE | いいえ | 0 ~ 1000 | 1000 | 項目数に関するキャッシュの最大サイズ。値 0 は、キャッシュしないことを示します。両方のキャッシュ TTL 値が 0 の場合、この変数は無視されます。 |
PARAMETERS_SECRETS_EXTENSION_HTTP_PORT | いいえ | 1 ~ 65535 | 2773 | ローカル HTTP サーバーのポート。 |
PARAMETERS_SECRETS_EXTENSION_MAX_CONNECTIONS | いいえ | 最小 1。上限なし。 | 3 | Extensionsが Parameter Store または Secrets Manager へのリクエストを行うために使用する HTTP クライアントの最大接続数。 |
PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL | いいえ | DEBUG, WARN, ERROR, NONE, INFO | INFO | Extensionsのログレベル |
値の取得方法
ローカルホストに対して以下のようなHTTPリクエストを行うことで値を取得することができます。
GET: /systemsmanager/parameters/get?name=parameter-path?version=version&label=label&withDecryption={true|false}
parameter-pathに関してはParameter storeのNameと ARNで指定することが可能です。
注意点
- パスに含まれる/(スラッシュ)はエスケープする必要があります。
- 例 「/abc/def/hij/」の場合は「%20/abc%20/def%20/hij%20/」
- 検証の為「X-Aws-Parameters-Secrets-Token 」ヘッダーに「AWS_SESSION_TOKEN 」を設定する必要があります
- デフォルトのポートは2773となっています。(環境変数で変更可能)
サンプル
import requests import os def get_parameter(): end_point = 'http://localhost:2773' path = '/systemsmanager/parameters/get/?name=test_param' url = end_point + path headers = { 'X-Aws-Parameters-Secrets-Token': os.environ['AWS_SESSION_TOKEN'] } res = requests.get(url, headers=headers)
最後に
Twitterの反応を見ていると、割と多くの方が望んでいたアップデートのように見受けれらます。自前でキャッシュを実装する必要がなくなったので、嬉しい方も多いのではないでしょうか?
また、今回のアップデートではArmアーキテクチャではまだサポートされていませんので、こちらも対応してくれることを期待ですね!